OSG渲染模式设置实现半透明效果 您所在的位置:网站首页 osg 透明 设置渲染顺序 OSG渲染模式设置实现半透明效果

OSG渲染模式设置实现半透明效果

2024-07-11 23:26| 来源: 网络整理| 查看: 265

一、代码

osg::ref_ptr createSceneGraph() { osg::ref_ptr geom = new osg::Geometry(); osg::ref_ptr v = new osg::Vec3Array(); geom->setVertexArray(v.get()); //定义四个定点位置 v->push_back(osg::Vec3(-1.f, 0.f, -1.f)); v->push_back(osg::Vec3(1.f, 0.f, -1.f)); v->push_back(osg::Vec3(1.f, 0.f, 1.f)); v->push_back(osg::Vec3(-1.f, 0.f, 1.f)); osg::ref_ptr c = new osg::Vec4Array(); geom->setColorArray(c.get()); //设置颜色绑定模式 geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX); //设置颜色半透明, 注意颜色向量最后一位, 1.f表示完全不透明 c->push_back(osg::Vec4(1.f, 0.f, 0.f, 0.2f)); c->push_back(osg::Vec4(0.f, 1.f, 0.f, 0.2f)); c->push_back(osg::Vec4(0.f, 0.f, 1.f, 0.2f)); c->push_back(osg::Vec4(1.f, 1.f, 1.f, 0.2f)); //设置法向量 osg::ref_ptr n = new osg::Vec3Array(); geom->setNormalArray(n.get()); geom->setNormalBinding(osg::Geometry::BIND_OVERALL); n->push_back(osg::Vec3(0.f, -1.f, 0.f)); geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4)); osg::ref_ptr geode = new osg::Geode(); geode->addDrawable(geom.get()); //开启融合操作模式 geode->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON); //设置渲染模式 geode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); //关闭光照 geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); return geode.get(); }

二、运行效果(效果对照链接:https://blog.csdn.net/qq_35097289/article/details/80415835)

三、补充

当view更新后半透明效果失效, 查阅资料后得知是渲染级别的问题, 原来OSG加载进来的所有node渲染级别默认都是-1, 也就是说在未设置渲染级别的情况下, 渲染级别都是一样的。在这种情况下,取消深度测试后以实现半透明效果,但半透明效果的node节点会被其它node节点“覆盖, 所以需要如下操作: 

添加代码: geode->getOrCreateStateSet()->setRenderBinDetails(11, "RenderBin");

//Alpha blending on geode->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON); geode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); //Close the depth test geode->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF); geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF|osg::StateAttribute::PROTECTED); //Set the rendering priority, if not set the default value is -1 geode->getOrCreateStateSet()->setRenderBinDetails(11, "RenderBin");



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有